﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using Sistema_Totem.Logica.Clases;
using Sistema_Totem.Logica.Excepciones;

namespace Sistema_Totem.Datos.SqlServer
{
    public class SqlServerInvolucrado
    {
        
            #region Agregar Involucrado

            public int AgregarInvolucrado(Involucrado involucrado)
            {
                //se instancia un objeto de tipo conexion y sqlCommand
                //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
                Conexion miConexion = new Conexion();
                SqlCommand command = new SqlCommand();
                try
                {
                    miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                    // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                    command.Connection = miConexion.ObjetoConexion();
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.CommandText = "[dbo].[insertarInvolucrado]"; // nombre del StoreProcedure "insertarInvolucrado"
                    command.CommandTimeout = 10;

                    //variables del stored procedure de sql server.
                    command.Parameters.AddWithValue("@idRol", involucrado.Rol.Id);
                    command.Parameters.AddWithValue("@nombre", involucrado.Nombre);
                    command.Parameters.AddWithValue("@telefono", involucrado.Telefono);
                    command.Parameters.AddWithValue("@correo", involucrado.Correo);
                    command.Parameters.AddWithValue("@idInsertado", SqlDbType.Int);

                    command.Parameters["@idRol"].Direction = ParameterDirection.Input;
                    command.Parameters["@nombre"].Direction = ParameterDirection.Input;
                    command.Parameters["@telefono"].Direction = ParameterDirection.Input;
                    command.Parameters["@correo"].Direction = ParameterDirection.Input;
                    command.Parameters["@idInsertado"].Direction = ParameterDirection.Output;

                    //se ejecuta el comando
                    command.ExecuteReader();
                    //se lee la variable de tipo output para saber que id fue insertado en base de datos.
                    int idInsertado = (int)command.Parameters["@idInsertado"].Value;
                    // hacemos el return del ID del cliente para verficar que efectivamente se inserto el cliente
                    return idInsertado;
                }
                catch (SqlException e)
                {
                    throw new Exception("Error en la conexion");
                }
                //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
                finally
                {
                    miConexion.CerrarConexionBd();
                }
            }

            public int AsignarRolInvolucrado(int idInvolucrado)
            {
                return 0;
            }
            #endregion Agregar Involucrado

            #region Consultar Involucrado

            public List<Involucrado> ConsultarInvolucrados()
            {
                List<Involucrado> listaInvolucrado = new List<Involucrado>();

                Conexion miConexion = new Conexion();
                SqlCommand command = new SqlCommand();
                try {
                        miConexion.AbrirConexionBd();
                        command.Connection = miConexion.ObjetoConexion();
                        command.CommandType = System.Data.CommandType.Text;
                        command.CommandText = "[dbo].[consultarTodosInvolucrado]"; //Nombre del StoreProcedure "consultarTodosInvolucrado"
                        command.CommandTimeout = 10;

                        SqlDataReader reader = command.ExecuteReader();

                        while (reader.Read())
                        {
                            Involucrado involucrado = new Involucrado();

                            involucrado.Id = Convert.ToInt32(reader[0]);
                            involucrado.Nombre = reader[1].ToString();
                            involucrado.Correo = reader[2].ToString();
                            involucrado.Telefono = reader[3].ToString();                           
                            involucrado.Rol.Nombre = reader[4].ToString();

                            listaInvolucrado.Add(involucrado);
                        }
                        reader.Close();
                   } 
                   catch (SqlException error)
                   {
                        throw (new InvolucradoExcepcion( "Error en la conexion: " + error));
                   }
                   catch (NullReferenceException error)
                   {
                        throw (new Exception( "Los valores que devuelven la consulta son null", error ));
                   }
                    //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
                   finally
                   {
                        miConexion.CerrarConexionBd();
                   }
                
                // Validamos que efectivamente la consulta devuelve aunque sea el nombre distinto a "NULL"
                if (listaInvolucrado.ElementAt(0).Nombre == null)
                {
                    return null;
                }
                else // Sino retornamos la lista del tipo Involucrados
                    return listaInvolucrado;
            }
            #endregion Consultar Involucrado

            #region Modificar Involucrado

            public int ModificarInvolucrado(Involucrado involucrado)
            {
             //se instancia un objeto de tipo conexion y sqlCommand
                //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
                Conexion miConexion = new Conexion();
                SqlCommand command = new SqlCommand();
                int idInsertado = 1;
                try
                {
                    miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                    // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                    command.Connection = miConexion.ObjetoConexion();
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.CommandText = "[dbo].[modificarInvolucrado]"; // nombre del StoreProcedure "modificarInvolucrado"
                    command.CommandTimeout = 10;

                    //variables del stored procedure de sql server.
                    command.Parameters.AddWithValue("@idInvolucrado", involucrado.Id);
                    command.Parameters.AddWithValue("@idRol", involucrado.Rol.Id);
                    command.Parameters.AddWithValue("@nombre", involucrado.Nombre);
                    command.Parameters.AddWithValue("@telefono", involucrado.Telefono);
                    command.Parameters.AddWithValue("@correo", involucrado.Correo);                

                    command.Parameters["@idInvolucrado"].Direction = ParameterDirection.Input;
                    command.Parameters["@idRol"].Direction = ParameterDirection.Input;
                    command.Parameters["@nombre"].Direction = ParameterDirection.Input;
                    command.Parameters["@telefono"].Direction = ParameterDirection.Input;
                    command.Parameters["@correo"].Direction = ParameterDirection.Input;
              

                    //se ejecuta el comando
                    command.ExecuteReader();
                 
                    // hacemos el return del ID del cliente para verficar que efectivamente se inserto el cliente
                    return idInsertado;
                }
                catch (SqlException error)
                {
                    throw (new InvolucradoExcepcion("Error en la conexion: " + error));
                    idInsertado = 0;
                }
                catch (NullReferenceException error)
                {
                    throw (new InvolucradoExcepcion("Los valores que devuelven la consulta son null", error));
                    idInsertado = 0;
                }
                //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
                finally
                {
                    miConexion.CerrarConexionBd();
                }
            }
            #endregion Modificar Involucrado


        
    }
}